/*
 * @lc app=leetcode.cn id=678 lang=java
 *
 * [678] 有效的括号字符串
 *
 * https://leetcode-cn.com/problems/valid-parenthesis-string/description/
 *
 * algorithms
 * Medium (28.74%)
 * Likes:    64
 * Dislikes: 0
 * Total Accepted:    2.6K
 * Total Submissions: 9.2K
 * Testcase Example:  '"()"'
 *
 * 给定一个只包含三种字符的字符串：（ ，） 和 *，写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则：
 *
 *
 * 任何左括号 ( 必须有相应的右括号 )。
 * 任何右括号 ) 必须有相应的左括号 ( 。
 * 左括号 ( 必须在对应的右括号之前 )。
 * * 可以被视为单个右括号 ) ，或单个左括号 ( ，或一个空字符串。
 * 一个空字符串也被视为有效字符串。
 *
 *
 * 示例 1:
 *
 *
 * 输入: "()"
 * 输出: True
 *
 *
 * 示例 2:
 *
 *
 * 输入: "(*)"
 * 输出: True
 *
 *
 * 示例 3:
 *
 *
 * 输入: "(*))"
 * 输出: True
 *
 *
 * 注意:
 *
 *
 * 字符串大小将在 [1，100] 范围内。
 *
 *
 */

// @lc code=start
class Solution {
    public boolean checkValidString(String s) {
        int cnt = 0, sum = 0, n = 0;
        for(char c : s.toCharArray()) {
            switch(c) {
                case('('): {
                    cnt++;
                    break;
                }
                case(')'): {
                    if(cnt > 0) {
                        cnt--;
                    } else {
                        if(n > 0) {
                            n--;
                        } else {
                            return false;
                        }
                    }
                    break;
                }
                case('*'): {
                    n++;
                    break;
                }
            }
        }
        return cnt <= n;
    }
}
// @lc code=end

